package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.DocumentTypeEnum;
import br.com.hs.nfe.common.anotation.Element;
import br.com.hs.nfe.common.anotation.Node;
import br.com.hs.nfe.common.anotation.TypeEnum;
import br.com.hs.nfe.common.validation.Validable;
import br.com.hs.nfe.common.enumeration.CRTEnum;
import br.inf.portalfiscal.nfe.TEnderEmi;
import br.inf.portalfiscal.nfe.TNFe;

/**
 * Classe de dados do emitente da NFe.
 * @author Ranlive Hrysyk
 */
@Node(id = "C", name = "Emitente")
public class EmitenteTO extends BaseTO implements Validable {

    @Element(elementName = "CNPJ", publicName = "CNPJ", type = TypeEnum.CARACTER, min = 14, max = 14, required = false, formart = "[0-9]{14}", document= DocumentTypeEnum.CNPJ)
    private String cnpj;
    @Element(elementName = "CPF", publicName = "CPF", type = TypeEnum.CARACTER, min = 11, max = 11, required = false, formart = "[0-9]{11}", document= DocumentTypeEnum.CPF)
    private String cpf;
    @Element(publicName = "Razão Social/Nome", type = TypeEnum.CARACTER, min = 2, max = 60)
    private String xNome;
    @Element(publicName = "Nome Fantasia", type = TypeEnum.CARACTER, min = 1, max = 60, required = false)
    private String xFant;
    @Element(elementName = "enderEmit", publicName = "Endereço", type = TypeEnum.NODE, classType = TEnderEmi.class)
    private EnderecoTO enderEmit;
    @Element(elementName = "IE", publicName = "Incrição Estadual", type = TypeEnum.CARACTER, max = 14, formart = "[0-9]{2,14}|ISENTO")
    private String ie;
    @Element(elementName = "IEST", publicName = "Incrição Estadual do Substituto Tributário", type = TypeEnum.CARACTER, min = 2, max = 14, required = false, formart = "[0-9]{2,14}")
    private String ieST;
    @Element(elementName = "IM", publicName = "Incrição Municipal", type = TypeEnum.CARACTER, min = 1, max = 15, required = false)
    private String im;
    @Element(elementName = "CNAE", publicName = "CNAE", type = TypeEnum.CARACTER, min = 7, max = 7, required = false, formart = "[0-9]{7}")
    private String cnae;
    @Element(elementName = "CRT", publicName = "Código do Regime Tributário", type = TypeEnum.ENUM, classType = TNFe.InfNFe.Emit.CRT.Enum.class)
    private CRTEnum crt;
    private byte[] logotipo;

    /**
     * CNPJ do emitente.
     */
    public String getCNPJ() {
        return cnpj;
    }

    /**
     * Informar o CNPJ do emitente.
     * <p><i>O CNPJ deve ser informado com os zeros não significativos.</i></p>
     * @param cnpj CNPJ do emitente
     */
    public void setCNPJ(String cnpj) {
        this.cnpj = cnpj;
    }

    /**
     * CPF do emitente.
     */
    public String getCPF() {
        return cpf;
    }

    /**
     * Informar o CPF do emitente.
     * <p><b>Em se tratando de emissão de NF-e avulsa pelo Fisco, as informações do remetente serão informadas neste grupo.</b></p>
     * <p><i>O CPF deve ser informado com os zeros não significativos.</i></p>
     * @param cpf CPF do emitente
     */
    public void setCPF(String cpf) {
        this.cpf = cpf;
    }

    /**
     * Razão Social ou Nome.
     */
    public String getXNome() {
        return xNome;
    }

    /**
     * Informar a razão social ou nome do emitente.
     * @param xNome Razão Social ou Nome
     */
    public void setXNome(String xNome) {
        this.xNome = xNome;
    }

    /**
     * Nome Fantasia.
     */
    public String getXFant() {
        return xFant;
    }

    /**
     * Informar o nome fantasia do emitente.
     * @param xFant Nome Fantasia
     */
    public void setXFant(String xFant) {
        this.xFant = xFant;
    }

    /**
     * Endereço.
     */
    public EnderecoTO getEnderEmit() {
        return enderEmit;
    }

    /**
     * Informar o grupo de informações de endereço do emitente.
     * @param enderEmit Endereço
     */
    public void setEnderEmit(EnderecoTO enderEmit) {
        this.enderEmit = enderEmit;
    }

    /**
     * Incrição Estadual.
     */
    public String getIE() {
        return ie;
    }

    /**
     * Informar a incrição estadual do emitente.
     * <p><b>Campo de informação obrigatória nos casos de emissão própria (procEmi = 0, 2 ou 3.</b></p>
     * <p>O literal"<b>ISENTO</b>" deve ser informado apenas para contribuintes que são isentos de inscrição
     * no cadastro de contibuintes do ICMS e estejam emitindo NF-e avulsa.</p>
     * <p><i>A IE deve ser informada apenas com algarismos para destinatários contribuintes do ICMS, sem 
     * caracteres de formatação (ponto, barra, hífen, etc).</i></p>
     * @param ie Incrição Estadual
     */
    public void setIE(String ie) {
        this.ie = ie;
    }

    /**
     * Inscrição Estadual do Substituto Tributário.
     */
    public String getIEST() {
        return ieST;
    }

    /**
     * Informar a inscrição estadual do substituto tributário do emitente.
     * <p><i>Informar a IE do ST da UF de destino da mercadoria, quando houver a retenção do ICMS ST para a UF de destino.</i></p>
     * @param ieST Inscrição Estadual do Substituto Tributário
     */
    public void setIEST(String ieST) {
        this.ieST = ieST;
    }

    /**
     * Incrição Municipal.
     */
    public String getIM() {
        return im;
    }

    /**
     * Infomar a inscrição municipal do emitente.
     * <p>Este campo deve ser informado, quando ocorrer a emissão de NF-e conjugada, com prestação 
     * de serviços sujeitos ao ISSQN e fornecimento de peças sujeitos ao ICMS</p>
     * @param im Incrição Municipal
     */
    public void setIM(String im) {
        this.im = im;
    }

    /**
     * CNAE Fiscal.
     */
    public String getCNAE() {
        return cnae;
    }

    /**
     * Informar a CNAE fiscal do emitente.
     * <p><b>Este campo deve ser informado quando o campo IM (Inscrição Municipal) for informado.</b></p>
     * @param cnae CNAE Fiscal
     */
    public void setCNAE(String cnae) {
        this.cnae = cnae;
    }

    /**
     * Código do Regime Tributário.
     */
    public String getCRT() {
        if (crt != null) {
            return crt.getCRT();
        }
        return null;
    }

    /**
     * Código do Regime Tributário.
     */
    public CRTEnum getCRTEnum() {
        return crt;
    }

    /**
     * Informar o código do regime tributário do emitente.
     * <p>Este campo será obrigatoriamente preenchido com:<br>
     * 1 - Simples Nacional;<br>
     * 2 - Simples Nacional - excesso de sublime de receita bruta;<br>
     * 3 - Regime Normal.
     * </p>
     * @param crt Código do Regime Tributário
     */
    public void setCRT(String crt) {
        this.crt = CRTEnum.getEnumByCodigo(crt);
    }

    /**
     * Informar o código do regime tributário do emitente.     
     * @param crt Código do Regime Tributário
     */
    public void setCRTEnum(CRTEnum crt) {
        this.crt = crt;
    }

    /**
     * Logotipo do emitente.
     */
    public byte[] getLogotipo() {
        return logotipo;
    }

    /**
     * Informar o logotipo do emitente.
     * <p>Este campo será unicamente utilizado para impressão do DANFE.</p>
     * @param logotipo Logotipo do emitente
     */
    public void setLogotipo(byte[] logotipo) {
        this.logotipo = logotipo;
    }
}
